/*
进程间同步方式---文件锁
gcc filename -pthread -o a.out ，然后启动两个终端（进程）运行这个程序，发现在sleep的十秒时间内先后启动的程序都可以访问，两个进程都可以读这个文件（读时共享）
注意fcntl的f_lock参数
*/
#include<fcntl.h>
#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
void sys_err(char *str){//错误处理封装
  perror(str);
  exit(1);
}

int main(int argc,char *argv[]){//第二个参数传入任意一个文件
  int fd;
  struct flock f_lock;
  if(argc<2){
    printf("./a.out filename\n");
    exit(1);
  }
  if((fd=open(argv[1],O_RDWR))<0)//打开文件
    sys_err("open");
  
//f_lock.l_type=F_WRLCK;//选用写锁，写时独占哦
  f_lock.l_type=F_RDLCK;//选用读锁，读时共享，多个进程可以一起读

  f_lock.l_whence=SEEK_SET;
  f_lock.l_start=0;
  f_lock.l_len=0;//len=0表示对这个文件加锁

  fcntl(fd,F_SETLKW,&f_lock);//F_SETLKW，这个W表示wait，意思是阻塞
  printf("get flock\n");
  
  sleep(10);

 f_lock.l_type=F_UNLCK;
 fcntl(fd,F_SETLKW,&f_lock);
 printf("un flock\n");
 close(fd);
 return 0;
}
